import numpy as np
import sys, os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist
# 神经网络的“学习”是指从训练数据中自动获取最优权重参数的过程。
# 只对某个数据集过度拟合的状态称为过拟合（over fitting）。
# 神经网络以某个指标为线索寻找最优权重参数。神经网络的学习中
# 所用的指标称为损失函数（loss function）。这个损失函数可以使用任意函数，
# 但一般用均方误差和交叉熵误差等。

# 均方误差
def mean_squared_error(y,t):
    return 0.5*np.sum((y-t)**2)

t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
# print(mean_squared_error(np.array(y), np.array(t)))

# 交叉熵误差
def cross_entropy_error(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))
#  添加一个delta防止出现log(0)

#print(cross_entropy_error(np.array(y),np.array(t)))

# mini-batch：
# 以全部数据为对象求损失函数的和，则计算过程需要花费较长的时间。再者，如果遇到大数据，数据量会有几百万、几千万之多，
# 这种情况下以全部数据为对象计算损失函数是不现实的。因此，我们从全部数据中选出一部分，作为全部数据的“近似”。
# 神经网络的学习也是从训练数据中选出一批数据（称为mini-batch,小批量），然后对每个mini-batch进行学习。

(x_train,t_train),(x_test,t_test) = load_mnist(normalize=True,one_hot_label=True)

# print(x_train.shape)
# print(x_test.shape)
# print(x_train.shape[0])

# 从这个训练数据中随机抽取10笔数据
train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size,batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
